package com.kaifamiao.month04.day27;

import java.io.*;

public class FileCutter {

    /**
     * 将指定文件 original 切割为体积不超过 size 字节的 N 份后，依次序放入到  directory  目录中。
     * @param original 表示被拆分的原始文件
     * @param size 表示拆分后的文件的体积上限
     * @param directory 表示拆分后的文件的存储目录
     * @return 总共被分成多少份
     */
    public  int split(final File original, final long size, final File directory) throws IOException {
        // 获取 original 的 byte 数组
        FileInputStream in = new FileInputStream(original);
        FileOutputStream out;
        if (!directory.exists())  directory.mkdirs();
        int len = (int)size;
        byte[] bytes = new byte[len];
        int length;
        String str;
        int count = 0;
        while ((length = in.read(bytes)) != -1 ) {
            str = directory.getAbsolutePath() + "\\test" + System.currentTimeMillis() + ".temp";
            ++count;
            out = new FileOutputStream(str);
            out.write(bytes, 0 , length);
        }
        in.close();
        return count;
    }

    /**
     * 将指定目录dir中的多个文件片段依次序合并到同一个文件target中，并返回合并后的文件体积。
     * @param dir 文件片段所在的目录 对应将大文件拆分后所得到的N个小文件的存放目录
     * @param target 合并后的文件的存放路径名
     * @return 合并之后的文件大小
     */
    public long join(final File dir, final File target) throws IOException {
        // 获取dir下的所有文件
        FileFilter fileFilter = pathname -> pathname.isFile() && pathname.getName().endsWith(".temp");
        File[] files = dir.listFiles(fileFilter);
        // 拼接之后的文件输出
        FileOutputStream out = new FileOutputStream(new File(target, "t.mp4"), true);
        long size = 0;
        if (files == null || files.length == 0) throw new FileNotFoundException("找不到指定文件");
        for (File file : files) {
            FileInputStream in = new FileInputStream(file);
            in.transferTo(out);
//            byte[] bytes = new byte[(int)file.length()];
//            int length = new FileInputStream(file).read(bytes);
//            out.write(bytes, 0, length);
            size += file.length();
            in.close();
        }
        return size;
    }

    public static void main(String[] args) throws IOException {
        FileCutter fc = new FileCutter();
//        File original = new File("E:\\1101\\test\\temp\\风之谷.mp4");
        long size = 1024 * 1024 * 100L; // 单次最大容量为100M
        File original = new File("E:\\1101\\temp\\test.mp4");
        File directory = new File("E:\\1101\\temp\\t");
        File target = new File("E:\\1101\\temp");
//        System.out.println("总共分割：" + fc.split(original, size, directory) + "份");
        System.out.println("合并之后的大小是：" + fc.join(directory, target) / 1024  + "KB");
    }
}
